\section{Modelado}
Esta secci\'on contiene los diagramas utilizados para modelar los requerimientos formalmente 
para luego utilizar en el dise\~no f\'isico.

\subsection{Diagrama de Entidad-Relaci\'on}
A continuaci\'on se muestra el diagrama de Entidad-Relaci\'on de la situaci\'on descripta. Tambien se incluye archivo \textit{er.png} en el disco de entrega para verlo con mejor resoluci\'on.
\begin{center}
\includegraphics[width=150mm]{../er/er_2_3.png}
\end{center}

\subsection{Diagrama Relaci\'onal}
A continuaci\'on se muestra el diagrama Relacional correspondiente al diagrama anterior.

\subsubsection{Areas, eventos y niveles de seguridad}

\startEntity{NivelDeSeguridad}
\addEntityPk{IDNIVEL}
\addEntityField{descripci\'on}
\printEntity{
PK = CK = \{IDNIVEL\} \\
}

\startEntity{Area}
\addEntityPk{IDAREA}
\addEntityFk{IDNIVEL}
\addEntityField{nombre}
\printEntity{
PK = CK = \{IDAREA\} \\
FK = \{IDNIVEL\} 
}

\startEntity{Evento}
\addEntityPkFk{IDAREA}
\addEntityPk{IDEVENTO}
\addEntityField{fechaHora}
\addEntityField{descrcipci\'on}
\printEntity{
PK = CK = \{(IDAREA, IDEVENTO)\} \\
FK = \{IDAREA\} \\
}

\subsubsection*{Restricciones}
\begin{itemize}
\item \modelRestrictionShouldBeIn{Area.IDNIVEL}{NivelDeSeguridad.IDNIVEL}
\item \modelRestrictionShouldBeIn{Evento.IDAREA}{Area.IDAREA}
\end{itemize}

\subsubsection{Empleados}

\startEntity{Empleado}
\addEntityPk{IDEMPLEADO}
\addEntityField{nombre}
\addEntityField{apellido}
\addEntityField{contrase\~na}
\addEntityField{categor\'ia}
\printEntity{
PK = CK = \{IDEMPLEADO\} \\
}

\startEntity{EmpleadoNoProfesional}
\addEntityPkFk{IDEMPLEADO}
\addEntityFk{IDNIVEL}
\printEntity{
PK = CK = \{IDEMPLEADO\} \\
FK = \{IDEMPLEADO, IDNIVEL\}
}
  
\startEntity{EmpleadoNoProfesionalTieneAcceso}
\addEntityPkFk{IDEMPLEADO}
\addEntityPkFk{IDAREA}
\addEntityField{franjaHoraria}
\printEntity{
PK = CK = \{(IDEMPLEADO, IDAREA)\} \\
FK = \{IDEMPLEADO, IDAREA\}
}

\startEntity{EmpleadoJerarquico}
\addEntityPkFk{IDEMPLEADO}
\addEntityFk{IDAREA}
\addEntityField{fechaInicioResponsable}
\printEntity{
PK = CK = \{IDEMPLEADO\} \\
FK = \{IDEMPLEADO, IDAREA\}
}

\startEntity{EmpleadoProfesional}
\addEntityPkFk{IDEMPLEADO}
\addEntityField{tipoProfesional}
\printEntity{
PK = CK = FK =\{IDEMPLEADO\} \\
}

\subsubsection*{Restricciones}
\begin{itemize}
\item \modelRestrictionShouldBeIn{EmpleadoNoProfesional.IDEMPLEADO}{Empleado.IDEMPLEADO}
\item \modelRestrictionShouldBeIn{EmpleadoJerarquico.IDEMPLEADO}{Empleado.IDEMPLEADO}
\item \modelRestrictionShouldBeIn{EmpleadoProfesional.IDEMPLEADO}{Empleado.IDEMPLEADO}
\item \modelRestrictionShouldBeInOrThree{Empleado.IDEMPLEADO}{EmpleadoNoProfesional.IDEMPLEADO}{EmpleadoJerarquico.IDEMPLEADO}{EmpleadoProfesional.IDEMPLEADO}
\item El atributo \modelRestrictionField{Empleado.categor\'ia} permite particionar en forma disjunta el conjunto de empleados seg\'un la subclasificac\'on descripta en las restricciones anteriores.

\item \modelRestrictionShouldBeIn{EmpleadoNoProfesional.IDNIVEL}{NivelDeSeguridad.IDNIVEL}
\item \modelRestrictionShouldBeIn{EmpleadoNoProfesionalTieneAcceso.IDEMPLEADO}{EmpleadoNoProfesional.IDEMPLEADO}
\item \modelRestrictionShouldBeIn{EmpleadoNoProfesionalTieneAcceso.IDAREA}{Area.IDAREA}
\item \modelRestrictionField{EmpleadoNoProfesional.IDNIVEL} debe ser igual al de \modelRestrictionField{Area.IDNIVEL} si son PK de \modelRestrictionField{EmpleadoNoProfesionalTieneAcceso}

\item \modelRestrictionShouldBeIn{EmpleadoJerariquico.IDAREA}{Area.IDAREA}
\item \modelRestrictionShouldBeIn{Area.IDAREA}{EmpleadoJerariquico.IDAREA}
\end{itemize}

\subsubsection{Empleados profesionales y auditor\'ias}

\startEntity{ProfesionalPlantaPermanente}
\addEntityPk{IDEMPLEADO}
\addEntityFk{IDAREA}
\printEntity{
PK = CK = \{IDEMPLEADO\} \\
FK =\{IDEMPLEADO, IDAREA\} \\
}

\startEntity{ProfesionalContratado}
\addEntityPk{IDEMPLEADO}
\printEntity{
PK = CK = FK = \{IDEMPLEADO\} \\
}


\startEntity{Contrato}
\addEntityPkFk{IDEMPLEADO}
\addEntityPk{NUMEROCONTRATO}
\addEntityFk{IDAREA}
\addEntityField{fechaInicio}
\addEntityField{fechaFin}
\addEntityField{tarea}
\printEntity{
PK = CK = \{(IDEMPLEADO, NUMEROCONTRATO)\} \\
FK = \{IDEMPLEADO, IDAREA\} \\
}

\startEntity{Auditoria}
\addEntityPkFk{IDEMPLEADO}
\addEntityPkFk{NUMEROCONTRATO}
\addEntityPk{IDAUDITORIA}
\addEntityField{fechaHora}
\addEntityField{resultado}
\printEntity{
PK = CK = \{(IDEMPLEADO, NUMEROCONTRATO, IDAUDITORIA)\} \\
FK = \{(IDEMPLEADO, NUMEROCONTRATO)\} \\
}

\subsubsection*{Restricciones}
\begin{itemize}
\item \modelRestrictionShouldBeIn{ProfesionalPlantaPermanente.IDEMPLEADO}{EmpleadoProfesional.IDEMPLEADO}
\item \modelRestrictionShouldBeIn{ProfesionalContratado.IDEMPLEADO}{EmpleadoProfesional.IDEMPLEADO}
\item \modelRestrictionShouldBeInOrTwo{EmpleadoProfesional.IDEMPLEADO}{ProfesionalPlantaPermanente.IDEMPLEADO}{ProfesionalContratado.IDEMPLEADO}
\item El atributo \modelRestrictionField{EmpleadoProfesional.tipoProfesional} permite particionar en forma disjunta el conjunto de empleados profesionales seg\'un la subclasificac\'on descripta en las restricciones anteriores.
\item \modelRestrictionShouldBeIn{Contrato.IDEMPLEADO}{ProfesionalContratado.IDEMPLEADO}
\item \modelRestrictionShouldBeIn{Contrato.IDAREA}{Area.IDAREA}
\item El atributo \modelRestrictionField{Contrato.fechaInicio} debe ser anterior al valor de \modelRestrictionField{Contrato.fechaFin}.
\item \modelRestrictionShouldBeIn{Auditoria.(IDEMPLEADO, NUMEROCONTRATO)}{Contrato.(IDEMPLEADO, NUMEROCONTRATO)}
\end{itemize}

\subsubsection{Accesos de seguridad}

\startEntity{Acceso}
\addEntityPkFk{IDEMPLEADO}
\addEntityPkFk{AREA}
\addEntityPk{IDACCESO}
\addEntityField{metodoIdentificacion}
\addEntityField{fueAutorizado}
\addEntityField{fechaHoraIngreso}
\addEntityField{fechaHoraEgreso}
\printEntity{
PK = CK = \{(IDEMPLEADO, IDACCESO)\} \\
FK = \{IDEMPLEADO, IDAREA\} \\
}

\subsubsection*{Restricciones}
\begin{itemize}
\item \modelRestrictionShouldBeIn{Acceso.IDEMPLEADO}{Empleado.IDEMPLEADO}
\item \modelRestrictionShouldBeIn{Acceso.IDAREA}{Area.IDAREA}
\item El atributo \modelRestrictionField{Acceso.fechaHoraEgreso} debe estar vac\'io si el atributo \modelRestrictionField{Acceso.fueAutorizado} es falso, si 
no debe ser posterior al valor de \modelRestrictionField{Acceso.fechaHoraIngreso}.
\end{itemize}
